#include "service.h"
#include "ui_service.h"

Service::Service(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Service)
{
    ui->setupUi(this);
    //客户端连接请求
    connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(onNewconnection()));
    //定时检查失效套接字
    connect(&timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
}

Service::~Service()
{
    delete ui;
}

//创建服务器按钮槽函数
void Service::on_Create_clicked()
{
    //获取服务器端口
    port = ui->Edit_port->text().toShort();
    //设置服务器IP和端口
    if(tcpServer.listen(QHostAddress::Any,port)==true){
        qDebug()<<"创建服务器成功!";
        //禁用创建按钮和端口输入操作
        ui->Create->setEnabled(false);
        ui->Edit_port->setEnabled(false);
        //开启定时器
        timer.start(10000);
    }
    else{
        qDebug()<<"创建服务器失败！";
    }
}

//响应客户端连接请求槽函数
void Service::onNewconnection(){
    //获取和客户端通信的套接字
    QTcpSocket* tcpClient = tcpServer.nextPendingConnection();
    //保存套接字到容器
    tcpClientList.append(tcpClient);
    //当客户端给服务器发送消息，通信套接字发送信号
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
}
//接受客户端消息槽函数
void Service::onReadyRead(){
    //遍历容器，找出给服务器发送消息的客户端
    for(int i = 0;i<tcpClientList.size();i++){
        //bytesAvalilable获取当前套接字等待读取消息的字节数，为0表示没有消息
        if(tcpClientList.at(i)->bytesAvailable()){
            //消息读取存入buffer
            QByteArray buf = tcpClientList.at(i)->readAll();
            //显示
            ui->listWidget->addItem(buf);
            //滑块回滚到最底部
            ui->listWidget->scrollToBottom();
            //转发消息给所有在线客户端
            sendMessage(buf);
        }
    }
}
//转发客户端消息槽函数
void Service::sendMessage(const QByteArray& buf){
    for(int i = 0;i<tcpClientList.size();i++){
        tcpClientList.at(i)->write(buf);
    }
}
//定时器槽函数
void Service::onTimeout(void){
    //遍历检查容器
    for(int i = 0;i<tcpClientList.size();i++){
        //state()返回枚举型
        if(tcpClientList.at(i)->state() == QAbstractSocket::UnconnectedState){
            tcpClientList.removeAt(i);
            --i;
        }
    }
}
